/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import dao.Dao;
import entidades.Produto;
import entidades.Upload;
import entidades.Util;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author user
 */
@WebServlet(name = "ProdutoServlet", urlPatterns = {"/ProdutoServlet"})
public class ProdutoServlet extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /*
             * TODO output your page here. You may use following sample code.
             */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet ProdutoServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet ProdutoServlet at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String op = request.getParameter("op");
        int id = Integer.parseInt(request.getParameter("id"));
        Dao<Produto> daoProduto = new Dao<Produto>(Produto.class);
        HttpSession session = request.getSession(true);
        if (op.equals("Ver")) {
            Produto produto = daoProduto.get(id);
            session.setAttribute("produto", produto);

            response.sendRedirect("visualizarProduto.jsp");
        } else if (op.equals("Remover")) {
            Produto produto = daoProduto.get(id);
            for (String foto : produto.getFotos()) {
                Upload.removeFile(getServletContext().getRealPath(dir), foto);
            }

            daoProduto.remove(id);

//            Upload.removeFile(dir, dir)

            request.setAttribute("produtos", daoProduto.list());
            request.setAttribute("buscou", true);
            RequestDispatcher rd = request.getRequestDispatcher("gerenciarProduto.jsp");
            rd.forward(request, response);
        } else if (op.equals("Editar")) {
            Produto produto = daoProduto.get(id);
            session.setAttribute("produto", produto);

            response.sendRedirect("editarProduto.jsp");
        } else if (op.equals("Ver")) {
            Produto produto = daoProduto.get(id);
            session.setAttribute("produto", produto);

            response.sendRedirect("visualizarProduto.jsp");
        }

    }
    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    public final String dir = "/fotos/";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //Cria um objeto upload já setando e criando o diretorio que os
        // arquivos serão armazenados
        Upload upload = new Upload(getServletContext().getRealPath(dir));
        HttpSession session = request.getSession(true);

        // Retorna um list com todos os componentes de uma requisição
        List list = upload.processRequest(request);

        // Neste Map você obteve todos os campos do formulário.
        Map<String, String> map = upload.getFormValues(list);

        // Pega o atributo operacao
        String op = map.get("op");

        // Instancia um objeto do tipo Dao para manipular o banco de dados
        Dao<Produto> daoProduto = new Dao<Produto>(Produto.class);

        // Instancia um objeto do tipo produto para povoa-lo com os dados fornecidos pelo ususario
        Produto p = new Produto();

        // Trata cada uma das operacoes separadamente
        if (op.equals("Buscar")) {
            String nome = map.get("nome");
            List<Produto> produtos;
            if (nome == null) {
                nome = "";
            }
            produtos = daoProduto.listByNome(nome);
            request.setAttribute("buscou", true);
            request.setAttribute("produtos", produtos);

            RequestDispatcher rd = request.getRequestDispatcher("gerenciarProduto.jsp");
            rd.forward(request, response);
        }

        if (op.equals("Inserir Produto")) {
            response.sendRedirect("inserirProduto.jsp");
        }

        if (op.equals("Inserir")) {
            String nome = Util.codificarTexto(map.get("nome"));
            double valor = Util.getDouble(map.get("valor"));
            String descricao = Util.quebraLinha(Util.codificarTexto(map.get("descricao")));
            ArrayList<String> fotos = new ArrayList<String>();

            int numFotos = Integer.parseInt(map.get("numFotos"));
            for (int i = 0; i <= numFotos; i++) {
                fotos.add(map.get("foto" + i));
            }

            p.setNome(nome);
            p.setValor(valor);
            p.setDescricao(descricao);
            p.setFotos(fotos);

            daoProduto.insert(p);

            List<Produto> listaProduto = daoProduto.list();
            request.setAttribute("produtos", listaProduto);
            RequestDispatcher rd = request.getRequestDispatcher("gerenciarProduto.jsp");
            rd.forward(request, response);
        }

        if (op.equals("Atualizar")) {
            Produto produto = (Produto) session.getAttribute("produto");
            String descricao = Util.quebraLinha(Util.codificarTexto(map.get("descricao")));
            String nome = Util.codificarTexto(map.get("nome"));
            double valor = Util.getDouble(map.get("valor"));

            ArrayList<String> fotos = (ArrayList<String>) produto.getFotos();
            
            int numExcluidos = Integer.parseInt(map.get("numExcluidos"));
            String foto;
            for (int i = 0; i <= numExcluidos; i++) {
                foto = map.get("excluido" + i);
                fotos.remove(foto);
                Upload.removeFile(getServletContext().getRealPath(dir), foto);
            }
            
            int numFotos = Integer.parseInt(map.get("numFotos"));
            for (int i = 0; i <= numFotos; i++) {
                fotos.add(map.get("foto" + i));
            }
            
            produto.setFotos(fotos);
            produto.setNome(nome);
            produto.setValor(valor);
            produto.setDescricao(descricao);

            daoProduto.update(produto);

            List<Produto> produtos = daoProduto.list();
            request.setAttribute("produtos", produtos);
            RequestDispatcher rd = request.getRequestDispatcher("gerenciarProduto.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
